//函子
// class Num {
//     constructor (value) {
//        this.value = value ;
//     }      
//     add5 () {
//         return new Num( this.value + 5)
//     }
//     double () {
//         return new Num( this.value * 2)
//     }
//  }
//  let num = new Num(5);
//  let number =  num.add5 ().double ()
// console.log(number)

function double (x) {
    return x * 2
}
function add5 (x) {
    return x + 5
}
  
class Functor{
    constructor (value) {
        this.value = value ;
    } 
    static of (val) {
        return new Functor(val);
    }   
    map (fn) {
        return Functor.of(fn(this.value))
    }
}
  
let n = Functor.of(5).map(add5).map(double)
console.log("n", n)